/*
 * @(#)Test.java    Jul 26, 2010
 *
 * Copyright 2009 Nyber(Shanghai Itd. All rights reserved.
 */

package com.lab.puzzle;

import java.util.concurrent.Semaphore;

/**
 * 有三个线程分别是A、B、C, 用多线编程实现, 在屏幕上循环打印10次ABC.
 * 
 * 获得许可前, 每个线程必须从信号量获取许可, 从而保证可以使用.
 *
 * @author nickevin@gmail.com
 * @version Jul 26, 2010 3:48:24 PM
 */

class OrderThread implements Runnable {

    private int flag = 0;
    // 当许可为0时, 就要等待被释放. 每release一次就添加1个许可; 每acquire一次就减去1个许可, 直到为0.
    private static Semaphore[] semaphores = { new Semaphore(1) /*初始许可1个线程运行*/,
            new Semaphore(0), new Semaphore(0) };

    public OrderThread(int flag) {
        this.flag = flag;
    }

    public void run() {
        for (int idx = 0; idx < 10; idx++) {
            try {
                semaphores[flag].acquire(); // 当前线程从此信号量获取许可. 未获得许可的线程堵塞.
                System.out.print(Thread.currentThread().getName());
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphores[(flag + 1) % 3].release(); // 释放后一个信号量的许可.
            }
        }
    }

}